﻿using System;
using System.Collections.Generic;
using System.Text;
using DreamShield.Deployment.Installers.DreamPlugins;

namespace DreamShield.Deployment.Miles
{
    /// <summary>
    /// Classe de base pour tout les plugins basés sur Miles.
    /// Elle doit être décorée de l'attribut DreamShield.Extentions.Extention
    /// avec les arguments suivants :
    /// [Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid,
    /// "{GUID-UNIQUE-IDENTIFIANT-LA-DLL}")] 
    /// </summary>
    public abstract class MilesRoot : BaseDreamPluginContainer
    {
        /// <summary>
        /// Serveur de plugins, c'est cette classe qui va permettre de charger
        /// les différents plugins.
        /// 
        /// Ceux cis doivent être idéalement rajoutés au serveur au moment de l'évènement
        /// ServerInitialized
        /// </summary>
        public virtual MilesRootServer Server { get; protected set; }

        /// <summary>
        /// Ce produit lorsque le Serveur de plugins a été initialisé
        /// et devrais être utilisé pour rajouter les plugins
        /// </summary>
        public event EventHandler ServerInitialized;

        /// <summary>
        /// Appelé lorsque le serveur de plugin a été initialisé.
        /// Devrais correspondre au moment où les plugins sont rajoutés au serveur
        /// </summary>
        protected virtual void OnServerInitialized()
        {
            if (ServerInitialized != null)
                ServerInitialized(this, EventArgs.Empty);
        }

        /// <summary>
        /// Crée un serveu de plugin natif à DreamShield pour la connexion avec le runtime
        /// </summary>
        /// <param name="engine"></param>
        /// <returns></returns>
        public override IDreamPluginServer GetPluginServer(DreamPluginsEngine engine)
        {
            Server = new MilesRootServer(engine);

            OnServerInitialized();

            return Server;
        }
    }
}
